//东软HR8P506控制芯片
//跟芯片有关的配置,以及外设使用方式

// #include <stdint.h>
#include "chip.h"
#include "APP_Main.h"


//Internal System clock is 48MHz
void OscConfig(void)
{
	/*
    PLLClock_Config(Enable, SCU_PLL_IN16M, SCU_PLL_48M, Enable);
    SCU->SCLKEN0.CLKFLT_BY = 0x55; //PLL倍频到48M时,需要旁路时钟滤波器CLKFLT
	*/
}

void GPIOConfig(void)
{
    //GPIO_InitSettingType gpio;
/*
    gpio.Signal = GPIO_Pin_Signal_Digital;
    gpio.Dir = GPIO_Direction_Output;
    gpio.Func = GPIO_Reuse_Func0;
    gpio.ODE = GPIO_ODE_Output_Disable;
    gpio.DS = GPIO_DS_Output_Normal;
    gpio.PUE = GPIO_PUE_Input_Disable;
    gpio.PDE = GPIO_PDE_Input_Disable;

    GPIO_Init(IO_Buzzer,&gpio);

    gpio.PDE = GPIO_PDE_Input_Enable;
    GPIO_Init(IO_Heater,&gpio);
    GPIO_Init(IO_Feed,&gpio);
    GPIO_Init(IO_Fan,&gpio);
    gpio.PDE = GPIO_PDE_Input_Disable;

    GPIO_Init(IO_KeyLed,&gpio);
    GPIO_WriteBit(IO_KeyLed,0);
    gpio.Dir = GPIO_Direction_Input;
    gpio.PUE = GPIO_PUE_Input_Enable;
    GPIO_Init(IO_Key1,&gpio);
    GPIO_Init(IO_Key2,&gpio);
    GPIO_Init(IO_Key3,&gpio);

    gpio.Signal = GPIO_Pin_Signal_Analog;
    gpio.PUE = GPIO_PUE_Input_Disable;
    GPIO_Init(IO_Oven,&gpio);
    GPIO_Init(IO_Probe1,&gpio);
    GPIO_Init(IO_Probe2,&gpio);
	*/
    GPIO_Init(GPIOA0,IO_Oven,Intput);
    GPIO_Init(GPIOA0,IO_Probe1,Intput);
    GPIO_Init(GPIOA0,IO_Probe2,Intput);
}

//24位系统递减计数器,递减至0可自重载计数初值
void SysTickConfig(void)
{
    //SYSTICK_InitStruType x;
/*
    x.SysTick_Value = 48000 * 2; //2ms,已通过示波器测量
    x.SysTick_ClkSource = SysTick_ClkS_Cpu;
    x.SysTick_ITEnable = Enable;
    SysTick_Init(&x);
    SysTick_Enable();
	 * */
}

//12位转换结果,11位有效精度
void ADConfig(void)
{
   // ADC_InitStruType x;
/*
    x.CLKS = ADC_CLKS_PCLK;
    x.CLKDIV = ADC_CLKDIV_1_32;
    x.VREF_SEL = ADC_VREF_SEL_1_8; //内部参考电压1.8v
    x.VREFP = ADC_VREFP_VDD;
    x.VREFN = ADC_VREFN_VSS; //负向参考电压: 内部地电压VSS
    x.CHS = ADC_Channel_Oven; //默认通道 烤炉AD通道
    x.SMPS = ADC_SMPS_SOFT; //采样模式软件控制
    x.ST = 0; //硬件采样时间,硬件控制模式时有效
    ADC_Init(&x);
    ADC_Start();
	*/
}

void WdtConfig(void)
{
   // WDT_InitStruType x;
/*
    WDT_RegUnLock();
    x.WDT_Tms = 2000; //Tick 2s
    x.WDT_IE = Enable;
    x.WDT_Rst = Enable;
    x.WDT_Clock = WDT_CLOCK_PCLK;
    WDT_Init(&x);
    WDT_Enable(); //WDT Enable in UnLock
    WDT_Disable();
    WDT_RegLock();
	*/
}

void SystemConfig(void)
{
    OscConfig();
    GPIOConfig();
    SysTickConfig();
    ADConfig();
    WdtConfig();
   // DeviceClockAllEnable(); //Open All Clock
}

//单次采样指定通道
uint32_t SamplingSingle(uint32_t channel)
{
    uint16_t i;
    uint32_t temp = 0;
/*
    ADC_Set_CH(channel); //Setting Sample Channel
    ADC_SoftStart();
    for (i = 0; i < 500; i++); //上电后的电压不是很稳定,若不延迟,会采集到不稳定电压,增加一点采样时间起到过滤不稳定采样值的作用
    ADC_SoftStop();
    for (i = 0; i < 5000; i++);
    while(ADC_GetIFStatus(ADC_IF) == RESET);
    if(ADC_GetIFStatus(ADC_IF) != RESET)
    { //采样结束
        temp = ADC_GetConvValue();
        ADC_ClearIFStatus(ADC_IF);
    }
    */

   /*
    ADC12_RESET_VALUE();
    for (i = 0; i < 500; i++);
    ADC12_ConversionChannel_Config(channel,ADC12_CV_RepeatNum1,ADC12_AVGDIS,0); //channel switch
    ADC12_Control(ADC12_START); //Start conversion
    for (i = 0; i < 500; i++);
    ADC12_SEQEND_wait(0); //End of conversion wait
    temp = ADC0->DR[0]; //ADC data0
    ADC12_Control(ADC12_STOP);
    */
	
    if(channel == ADC_Switch)
    {
        ADC12_SEQEND_wait(0); //等待转换序列 0 转换完成
        temp= ADC0->DR[0]; //转换结果保存
    }
    else if(channel == ADC_Oven)
    {
        ADC12_SEQEND_wait(1); //等待转换序列 1 转换完成
        temp= ADC0->DR[1]; //转换结果保存
    }
    else if(channel == ADC_Meat1)
    {
        ADC12_SEQEND_wait(2); //等待转换序列 2 转换完成
        temp= ADC0->DR[2]; //转换结果保存
    }
    else if(channel == ADC_Meat2)
    {
        ADC12_SEQEND_wait(3); //等待转换序列 3 转换完成
        temp= ADC0->DR[3]; //转换结果保存
    }
    else if(channel == ADC_BAT_V)
    {
        ADC12_SEQEND_wait(4);
        temp= ADC0->DR[4];
    } 
    else if(channel == ADC_INTVREF_1v)
    {
        ADC12_SEQEND_wait(5);
        temp= ADC0->DR[5];
    } 

    return temp;
}
